package AlgoritmosGeneticos.model.impl.corte;

import java.util.Collection;
import java.util.HashMap;

import AlgoritmosGeneticos.model.CondicionCorte;
import AlgoritmosGeneticos.model.Individuo;
import AlgoritmosGeneticos.model.Poblacion;

public class CorteEstructura implements CondicionCorte{

	private int it;
	private int max;
	private double porcentaje;
	
	/**
	 * Condicion de corte de ciclo evolutivo de una poblacion.
	 * Se cumple mientras que ningún porcentaje de la población 
	 * sea mayor que porcentaje.
	 * 
	 * @param porcentaje porcentaje de la población que es identica
	 */
	public CorteEstructura(double porcentaje) {
		System.out.println("Corte por estructura");
		if( porcentaje < 0 || porcentaje > 1 )
			throw new IllegalArgumentException("porcentaje fuera de rango");
				
		this.porcentaje=porcentaje;
	}
	
	@Override
	public boolean seCumple(Poblacion pob) {
		return verificaPoblacion(pob,false);
	}
	
	/**
	 * 
	 * @param pob
	 * @param seeHash if you want to see hashTable
	 * @return
	 */
	
	public boolean verificaPoblacion(Poblacion pob, boolean seeHash){
		HashMap<Individuo,Integer> checkPob = new HashMap<Individuo,Integer>();
		
		for(Individuo i: pob.getIndividuos()){
			if(checkPob.containsKey(i)){
				checkPob.put(i, checkPob.get(i)+1);
			}else{
				checkPob.put(i, new Integer(1));
			}
		}
		
		Collection<Integer> subtotales = checkPob.values();
		float total = pob.getIndividuos().size();

		if(seeHash == true){
			System.out.println( "Hash:" );
			for(Individuo i:checkPob.keySet()){
				System.out.println(i.toNumber() + " p: " + checkPob.get(i)/total);
			}
		}

		for( Integer sub :subtotales ){
			if( sub/total >= this.porcentaje || it > max)
				return false;
		}
		it++;
		return true;
	}

	@Override
	public void setMaxIterations(int iterations) {
		this.max=iterations;
	}
	
}
